home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
041-050
/
amok50
/
fonttooberon
/
fonttooberon.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
10KB
|
256 lines
(*---------------------------------------------------------------------------
:Program. FontToOberon.mod
:Contents. Converts Amiga fonts to oberon source code
:Author. Christian Stiens
:Address. Heustiege 2, W-4710 Lüdinghausen
:Copyright. PD
:Language. Oberon
:Translator. Amiga Oberon V1.17.1 A+L
:History. V1.0, 03-Mar-91
:Usage. FontToOberon <font-file> TO <source-file>
---------------------------------------------------------------------------*)
MODULE FontToOberon;
(* $RangeChk- $OvflChk- $CaseChk- $ReturnChk- $NilChk- $StackChk- *)
IMPORT
a : Arguments,
d : Dos,
df : DiskFont,
s : SYSTEM,
g : Graphics,
fs : FileSystem,
st : Strings,
e : Exec,
c : Conversions,
io;
CONST (* Error messages *)
writeerr = "Write error\n";
noinput = "Can't open input file\n";
nooutput = "Can't open output file\n";
usage = "Usage: FontToOberon <font-file> TO <source-file>\n";
nofont = "That's not a font\n";
CONST
wordsPerLine = 10;
TYPE
IntPtr = POINTER TO INTEGER;
VAR
arg,name : ARRAY 256 OF CHAR;
out : fs.File;
seg : e.BPTR;
segSize : LONGINT;
dummy : e.ADDRESS;
dfh : POINTER TO df.DiskFontHeader;
numChars : LONGINT;
numDataWords: LONGINT;
pos : INTEGER;
CONST
iconSize = 781;
PROCEDURE * IconData; (* $EntryExitCode- *)
BEGIN s.INLINE(
0E310H,00001H,00000H,00000H,000CCH,0000CH,0002AH,0001BH,00006H,00001H,
00001H,000C1H,0B6A0H,000C1H,0B778H,00004H,099A6H,00000H,00000H,00000H,
00000H,00064H,00000H,00001H,0045CH,000C1H,0B5B0H,00000H,00000H,08000H,
00000H,08000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,
00000H,0002AH,0001BH,00002H,00001H,09B30H,00300H,00000H,00000H,00FFFH,
0FFFFH,0FC00H,01000H,00000H,01200H,01000H,00000H,01200H,017FFH,09FF0H,
01200H,01000H,00000H,01C00H,01673H,0C000H,01000H,01000H,00000H,01000H,
017B9H,09F80H,01000H,01000H,00000H,01000H,01667H,00000H,01000H,01000H,
00000H,01000H,017FFH,03C00H,01000H,01000H,00000H,01000H,01700H,00000H,
01000H,01000H,00000H,01000H,0139CH,0C000H,01000H,01000H,00000H,01000H,
010E7H,0C000H,01000H,01000H,00000H,01000H,01380H,00000H,01000H,01000H,
00000H,01000H,07FFFH,0FFFFH,0D000H,08000H,00000H,09000H,08000H,00000H,
09000H,08000H,00000H,09000H,07FFFH,0FFFFH,0E000H,00000H,00000H,00000H,
00000H,00000H,00000H,00FFFH,0FFFFH,0EC00H,00FFFH,0FFFFH,0EC00H,00800H,
0600FH,0EC00H,00FFFH,0FFFFH,0E000H,0098CH,03FFFH,0E000H,00FFFH,0FFFFH,
0E000H,00846H,0607FH,0E000H,00FFFH,0FFFFH,0E000H,00998H,0FFFFH,0E000H,
00FFFH,0FFFFH,0E000H,00800H,0C3FFH,0E000H,00FFFH,0FFFFH,0E000H,008FFH,
0FFFFH,0E000H,00FFFH,0FFFFH,0E000H,00C63H,03FFFH,0E000H,00FFFH,0FFFFH,
0E000H,00F18H,03FFFH,0E000H,00FFFH,0FFFFH,0E000H,00C7FH,0FFFFH,0E000H,
00FFFH,0FFFFH,0E000H,00000H,00000H,02000H,07FFFH,0FFFFH,06000H,07FFFH,
0FFFFH,06000H,07FFFH,0FFFFH,06000H,00000H,00000H,00000H,00000H,00000H,
00000H,00000H,00000H,0002AH,0001BH,00002H,00001H,09C78H,00300H,00000H,
00000H,00FFFH,0FFFFH,0FC00H,01000H,00000H,01200H,01000H,00000H,01200H,
017FFH,09FF0H,01200H,01000H,00000H,01C00H,01673H,0C000H,01000H,01000H,
00000H,01000H,017B9H,09F80H,01000H,01000H,00000H,01000H,01667H,00000H,
01000H,01000H,00080H,01000H,017FFH,03C78H,01000H,01000H,0007EH,01000H,
01700H,0007FH,01000H,01000H,0007CH,09000H,0139CH,0C074H,05000H,01000H,
00022H,03000H,010E7H,0C011H,01000H,01000H,00008H,08800H,01380H,00004H,
04400H,01000H,00002H,02200H,07FFFH,0FFFFH,01100H,08000H,00000H,08880H,
08000H,00000H,0C480H,08000H,00000H,06380H,07FFFH,0FFFFH,0FE00H,00000H,
00000H,00000H,00000H,00000H,00000H,00FFFH,0FFFFH,0EC00H,00FFFH,0FFFFH,
0EC00H,00800H,0600FH,0EC00H,00FFFH,0FFFFH,0E000H,0098CH,03FFFH,0E000H,
00FFFH,0FFFFH,0E000H,00846H,0607FH,0E000H,00FFFH,0FFFFH,0E000H,00998H,
0FFFFH,0E000H,00FFFH,0FF7FH,0E000H,00800H,0C39FH,0E000H,00FFFH,0FFFDH,
0E000H,008FFH,0FFF8H,0E000H,00FFFH,0FFE3H,06000H,00C63H,03F8BH,0A000H,
00FFFH,0FFDDH,0C000H,00F18H,03FEEH,0E000H,00FFFH,0FFF7H,07000H,00C7FH,
0FFFBH,0B800H,00FFFH,0FFFDH,0DC00H,00000H,00000H,0EE00H,07FFFH,0FFFFH,
07700H,07FFFH,0FFFFH,03B00H,07FFFH,0FFFFH,09C00H,00000H,00000H,00000H,
00000H,00000H,00000H,00000H,0000BH,04F42H,04552H,04F4EH,03A4FH,04564H,
00000H)
END IconData;
PROCEDURE WriteString(str: ARRAY OF CHAR); (* $CopyArrays- *)
BEGIN
IF NOT fs.WriteBlock(out,s.ADR(str),st.Length(str)) THEN
io.WriteString(writeerr);
HALT(0)
END;
END WriteString;
PROCEDURE WriteInt(i: LONGINT);
VAR str : ARRAY 40 OF CHAR;
j : LONGINT;
n : SHORTINT;
BEGIN
j := i; n := 1;
WHILE j >= 10 DO j := j DIV 10; INC(n) END;
IF c.IntToStr(i,str,10,n," ") THEN WriteString(str) END;
END WriteInt;
PROCEDURE WriteHexChar(ch:CHAR);
VAR str: ARRAY 6 OF CHAR;
BEGIN
IF c.IntToHex(ORD(ch),str,3) THEN END;
str[3] := "X";
WriteString(str);
END WriteHexChar;
PROCEDURE WriteShortSet(s:SHORTSET);
VAR i:INTEGER;
flag:BOOLEAN;
BEGIN
WriteString("SHORTSET{");
i:=0; flag := FALSE;
WHILE i < 8 DO
IF i IN s THEN
IF flag THEN WriteString(",") END;
WriteInt(i); flag := TRUE;
END; INC(i)
END;
WriteString("}");
END WriteShortSet;
PROCEDURE WriteHexBlock(name: ARRAY OF CHAR; block: IntPtr; numWords: LONGINT); (* $CopyArrays- *)
VAR hexStr: ARRAY 8 OF CHAR;
n:INTEGER;
BEGIN
WriteString("PROCEDURE * "); WriteString(name); WriteString("; (* $EntryExitCode- *)\n");
WriteString("BEGIN sys.INLINE(");
n := 0;
WHILE numWords > 0 DO
IF n = 0 THEN WriteString("\n "); END;
INC(n); IF n=wordsPerLine THEN n:=0 END;
IF c.IntToHex(block^,hexStr,5) THEN END;
hexStr[0] := "0";
WriteString(hexStr);
IF numWords#1 THEN WriteString(",") END;
INC(block,2); DEC(numWords);
END;
WriteString(")\nEND "); WriteString(name); WriteString(";\n\n");
END WriteHexBlock;
PROCEDURE Letter(ch:CHAR):BOOLEAN;
BEGIN
RETURN (CAP(ch) >="A") & (CAP(ch) <= "Z") OR (ch >="0") & (ch <= "9")
END Letter;
PROCEDURE ExtractName(VAR str: ARRAY OF CHAR); (* dev:name.ext -> Name *)
VAR i,j,k:INTEGER;
BEGIN
i:=st.Length(str);
LOOP
DEC(i); IF (i<0) OR (str[i]=":") OR (str[i]="/") THEN EXIT END;
END; j:=i;
LOOP
INC(j);
IF (j >= st.Length(str)) OR ~Letter(str[j]) THEN EXIT END
END; k:=0;
LOOP
INC(i); IF i=j THEN EXIT END;
str[k] := str[i]; INC(k);
END;
IF k < LEN(str) THEN str[k]:=0X END;
str[0] := CAP(str[0]);
END ExtractName;
BEGIN
seg := NIL;
a.GetArg(2,arg); st.Upper(arg);
IF (a.NumArgs()#3) OR (arg#"TO") THEN io.WriteString(usage); HALT(0) END;
a.GetArg(1,arg);
seg := d.LoadSeg(arg);
IF seg # NIL THEN
DEC(seg);
segSize := seg^;
(* io.WriteString("segSize: ");io.WriteInt(segSize,1);io.WriteLn;*)
INC(seg);
dummy := seg; dfh := dummy;
INC(dfh,8);
IF dfh.fileId # df.dfhId THEN io.WriteString(nofont);HALT(0) END;
a.GetArg(3,arg); COPY(arg,name); ExtractName(name);
IF ~fs.Open(out,arg,TRUE) THEN io.WriteString(nooutput); HALT(0) END;
io.WriteString("Creating file "); io.WriteString(arg); io.WriteLn;
numChars := ORD(dfh.tf.hiChar) - ORD(dfh.tf.loChar) + 2;
(* io.WriteString("numChars: ");io.WriteInt(numChars,1);io.WriteLn;*)
WriteString("MODULE "); WriteString(name); WriteString(";\n\n");
WriteString("IMPORT\n e:Exec, g:Graphics, sys:SYSTEM;\n\n");
WriteString("VAR\n font * : g.TextFontPtr;\n\n");
numDataWords := (segSize-12-s.SIZE(df.DiskFontHeader)) DIV 2-numChars*2;
IF dfh.tf.charSpace # NIL THEN DEC(numDataWords,numChars) END;
IF dfh.tf.charKern # NIL THEN DEC(numDataWords,numChars) END;
(* io.WriteString("numDataWords: "); io.WriteInt(numDataWords,1); io.WriteLn;*)
(* io.WriteString("charData: ");io.WriteInt(dfh.tf.charData,1);io.WriteLn;*)
(* io.WriteString("charLoc: ");io.WriteInt(dfh.tf.charLoc,1);io.WriteLn;*)
(* io.WriteString("charSpace: ");io.WriteInt(dfh.tf.charSpace,1);io.WriteLn;*)
(* io.WriteString("charKern: ");io.WriteInt(dfh.tf.charKern,1);io.WriteLn;*)
WriteHexBlock("CharData",dfh.tf.charData,numDataWords);
WriteHexBlock("CharLoc",dfh.tf.charLoc,2*numChars);
IF dfh.tf.charSpace # NIL THEN
WriteHexBlock("CharSpace",dfh.tf.charSpace,numChars);
END;
IF dfh.tf.charKern # NIL THEN
WriteHexBlock("CharKern",dfh.tf.charKern,numChars);
END;
WriteString("BEGIN\n");
WriteString(" NEW(font)");
WriteString(";\n font.message.node.type := e.font");
WriteString(";\n font.message.node.name := sys.ADR(\""); WriteString(dfh.name);WriteString("\")");
WriteString(";\n font.message.length := sys.SIZE(g.TextFont)");
WriteString(";\n font.ySize := "); WriteInt(dfh.tf.ySize);
WriteString(";\n font.style := "); WriteShortSet(dfh.tf.style);
WriteString(";\n font.flags := "); WriteShortSet(dfh.tf.flags);
WriteString(";\n font.xSize := "); WriteInt(dfh.tf.xSize);
WriteString(";\n font.baseline := "); WriteInt(dfh.tf.baseline);
WriteString(";\n font.boldSmear := "); WriteInt(dfh.tf.boldSmear);
WriteString(";\n font.accessors := 0");
WriteString(";\n font.loChar := "); WriteHexChar(dfh.tf.loChar);
WriteString(";\n font.hiChar := "); WriteHexChar(dfh.tf.hiChar);
WriteString(";\n font.charData := CharData");
WriteString(";\n font.modulo := "); WriteInt(dfh.tf.modulo);
WriteString(";\n font.charLoc := "); WriteString("CharLoc");
WriteString(";\n font.charSpace := "); IF dfh.tf.charSpace # NIL THEN WriteString("CharSpace") ELSE WriteString("NIL") END;
WriteString(";\n font.charKern := "); IF dfh.tf.charKern # NIL THEN WriteString("CharKern") ELSE WriteString("NIL") END;
WriteString("\nEND "); WriteString(name); WriteString(".\n");
IF fs.Close(out) THEN END;
st.Append(arg,".info");
IF fs.Open(out,arg,TRUE) THEN
IF fs.WriteBlock(out,IconData,iconSize) THEN END;
IF fs.Close(out) THEN END;
END;
io.WriteString("--- Done\n");
ELSE
io.WriteString(noinput);
END;
CLOSE
IF seg # NIL THEN d.UnLoadSeg(seg) END;
END FontToOberon.